package com.sixmac.utils;

import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

public class CompressPic {

    // 缩略图默认宽度
    public static int defaultThumbWidth = 350;

    // 缩略图默认高度
    public static int defaultThumbHeight = 350;

    /**
     * 图片处理
     * 缩略图类（通用） 本java类能将jpg、bmp、png、gif图片文件，进行等比或非等比的大小转换。 具体使用方法
     * compressPic(大图片路径,生成小图片路径,大图片文件名,生成小图片文名,生成小图片宽度,生成小图片高度,是否等比缩放(默认为true))
     */
    public static String compressPic(File file, String outputFilePath, int outputWidth, int outputHeight, boolean isThumb) throws IOException {
        try {
            // 获得源文件
            Image img = ImageIO.read(file);
            // 判断图片格式是否正确
            if (img.getWidth(null) == -1) {
                System.out.println(" can't read,retry!" + "<BR>");
                return "图片格式不正确";
            } else {
                int newWidth;
                int newHeight;
                // 判断是否是等比缩放
                if (isThumb) {
                    // 为等比缩放计算输出的图片宽度及高度
                    double rate1 = ((double) img.getWidth(null)) / (double) outputWidth + 0.1;
                    double rate2 = ((double) img.getHeight(null)) / (double) outputHeight + 0.1;
                    // 根据缩放比率大的进行缩放控制
                    double rate = rate1 > rate2 ? rate1 : rate2;
                    newWidth = (int) (((double) img.getWidth(null)) / rate);
                    newHeight = (int) (((double) img.getHeight(null)) / rate);
                } else {
                    newWidth = outputWidth; // 输出的图片宽度
                    newHeight = outputHeight; // 输出的图片高度
                }
                BufferedImage tag = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_RGB);

				/*
                 * Image.SCALE_SMOOTH 的缩略算法 生成缩略图片的平滑度的 优先级比速度高 生成的图片质量比较好 但速度慢
				 */
                tag.getGraphics().drawImage(img.getScaledInstance(newWidth, newHeight, Image.SCALE_SMOOTH), 0, 0, null);
                File fs = new File(outputFilePath);
                if (!fs.getParentFile().exists()) {// 如果文件夹不存在
                    fs.getParentFile().mkdirs();// 创建上传文件夹
                }

                FileOutputStream out = new FileOutputStream(outputFilePath);
                // JPEGImageEncoder可适用于其他图片类型的转换
                JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
                encoder.encode(tag);
                out.close();
            }
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        return outputFilePath;
    }

    public static void main(String[] args) {
        try {
            System.out.println(compressPic(new File("D:\\pic.jpg"), "D:\\thumbnail\\测试压缩图片.jpg", 350, 350, false));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
